#include <errno.h>
#include "../ourhdr.h"

static void pr_sysconf(char*, int);
static void pr_pathconf(char*, char*, int);
/**
 * 系统配置及路径下的配置
 **/ 
int main(int argc, char* argv[])
{
    if(argc!=2)
    {
        err_quit("usage:  config.cmd <dirname> ");
    }
    //exec 函数参数最大长度（字节）
    pr_sysconf("ARG_MAX             =", _SC_ARG_MAX);
    //每个实际用户ID的最大进程数
    pr_sysconf("CHILD_MAX           =", _SC_CHILD_MAX);
    //每秒时秒滴答数
    pr_sysconf("clock ticks/second  =", _SC_CLK_TCK);
    //每个进程的最大同时添加组ID数
    pr_sysconf("NGPOUPS_MAX         =", _SC_NGROUPS_MAX);
    //每个进程最大打开文件数
    pr_sysconf("OPEN_MAX            =", _SC_OPEN_MAX);
    //在任一时刻每个进程的最大标准I/O流数
#ifdef _SC_STREAM_MAX
    pr_sysconf("STREAM_MAX          =", _SC_STREAM_MAX);
#endif
    //时区名是的最大字节数
#ifdef _SC_TZNAME_MAX
    pr_sysconf("TZNAME_MAX          =", _SC_TZNAME_MAX);
#endif
    //指明实现是否支持作业控制
    pr_sysconf("_POSIX_JOB_CONTROL  =", _SC_JOB_CONTROL);
    //指明实现是否支持保存的设置-用户-ID和保存的设置-组-ID
    pr_sysconf("_POSIX_SAVED_IDS    =", _SC_SAVED_IDS);
    //指明POXIX.1版本
    pr_sysconf("_POSIX_VERSION      =", _SC_VERSION);
    //在一终端规范输入队列的最大字节数
    pr_pathconf("MAX_CANON         =","/dev/tty",_PC_MAX_CANON);
    //终端输入队列可用空间的字节数
    pr_pathconf("MAX_INPUT         =","/dev/tty",_PC_MAX_INPUT);
    //专用字符开关
    pr_pathconf("_POSIX_VDISABLE   =","/dev/tty",_PC_VDISABLE);
    //文件连接数的最大值
    pr_pathconf("LINK_MAX          =",argv[1],_PC_LINK_MAX);
    //文件名中的最大字节数
    pr_pathconf("NAME_MAX          =",argv[1],_PC_NAME_MAX);
    //相对路径名中的最大字节数
    pr_pathconf("PATH_MAX          =",argv[1],_PC_PATH_MAX);
    //能原子写到一管首的最大字节数
    pr_pathconf("PIPE_BUF          =",argv[1],_PC_PIPE_BUF);
    //是否产生错误当文件名大于NAME_MAX
    pr_pathconf("_POSIX_NO_TRUNC   =",argv[1],_PC_NO_TRUNC);
    //指明使用chown是否受到限制
    pr_pathconf("_POSIX_CHOWN_RESTRICTED  =",argv[1],_PC_CHOWN_RESTRICTED);
    exit(0);
}

static void pr_sysconf(char *mesg, int name)
{
    long val;
    fputs(mesg, stdout);
    errno = 0;
    if( (val = sysconf(name)) < 0)
    {
        if(errno != 0)
        {
            err_sys("sysconf error");
        }
        fputs("  (not defined) \n", stdout);
    }
    else
    {
        printf(" %ld\n", val);
    }
}

static void pr_pathconf(char *mesg, char *path, int name)
{
    long val;
    fputs(mesg, stdout);
    errno = 0;
    if( (val = pathconf(path,name)) <0)
    {
        if(errno != 0) 
        {
            err_sys("pathconf error, path = %s",path);
        }
        fputs(" (no limit) \n",stdout);
    }
    else
    {
        printf(" %ld\n",val);
    }

}